# Implementare minimalista stdio

## Implemented functions

### SO_FILE
``` c
SO_FILE *so_fopen(const char *pathname, const char *mode);

int so_fclose(SO_FILE *stream);
```

### Read and write

``` c
int so_fgetc(SO_FILE *stream);

int so_fputc(int c, SO_FILE *stream);

size_t so_fread(void *ptr, size_t size, size_t nmemb, SO_FILE *stream);

size_t so_fwrite(const void *ptr, size_t size, size_t nmemb, SO_FILE *stream);
```

### Seek

``` c
int so_fseek(SO_FILE *stream, long offset, int whence);

long so_ftell(SO_FILE *stream);
```

### Buffering

``` c
int so_fflush(SO_FILE *stream);
```

### Extra

``` c
int so_fileno(SO_FILE *stream);

int so_feof(SO_FILE *stream);

int so_ferror(SO_FILE *stream);
```

## Organizare
-
1. Explicație pentru structura creată (sau soluția de ansamblu aleasă):
    - Cu scopul de a realiza o implementare cat mai usor de urmarit, am incercat, acolo unde am considerat necesar, sa implementez functiile cat mai explicit.
    Un astfel de exemplu este reprezentat de implementarea functiei 'fopen'. Am ales sa efectuez verificarile pentru permisiuni, impreuna cu deschiderea efectiva a fisierelor
    in functii separate, fiecare functie reprezentand un mod de deschidere al fisierului.
    - In cazul functiilor 'fgetc'/'fread'/'fputc'/'fwrite', am ales sa implementez doua functii responsabile cu operatiile de scriere/citire in buffer.
    - Aceste functii se numesc 'so_read_from_buffer', respectiv 'so_write_to_buffer'. Mecanismele necesare pentru implementarea suportului de buffering sunt surprinse prin functii precum 'so_{read|write}_{state}_{small|big}'. In aceste functii a fost mutat codul necesar fiecarei situatii in care se afla buffer-ul. Un dezavantaj este reprezentat de faptul ca anumite secvente de instructiuni se repeta in diferite functii.

***Obligatoriu:*** 
* Am incercat sa realizez tema intr-o maniera cat mai modulara, pentru a realiza implementarea cu un minim de efort pe ambele platforme.
* Consideri că tema este utilă? Da, intrucat prin aceasta implementare am cautat notiuni pe care le-am intalnit la diferite materii, cum ar fi teoria sistemelor, analiza algoritmilor, etc.
* Consideri implementarea naivă, eficientă, se putea mai bine? Da, se putea mult mai bine. Implementarea este primul prototip, dar aceasta trebuie modificata, intrucat pentru a implementa functiile 'popen'/'pclose', trebuie schimbat modul in care determin daca am ajuns sau nu la EOF, iar implementarea 'ftell' lasa de dorit.


* Am implementat totul, mai putin functiile 'popen'/'pclose'.
* Pentru modelare, am ales sa definesc anumite structuri, cum ar fi 'MODE', 'BOOL' si tipul enumerare 'LAST_OP' pentru a spori lizibilitatea codului.


Bibliografie
* https://ocw.cs.pub.ro/courses/so
